package com.ynkbny.web.controller;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ynkbny.base.PageResult;
import com.ynkbny.domain.SystemLog;
import com.ynkbny.domain.dto.TEpTotalEnergyDTO;
import com.ynkbny.domain.excel.TEpTotalEnergyExportVO;
import com.ynkbny.service.SystemLogService;
import com.ynkbny.service.TEpTotalEnergyService;
import com.ynkbny.util.Res;
import com.ynkbny.util.easyExcel.EasyExcelUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author YY
 * @Date 2023/7/11 16:47
 */
@Api(tags = "能单位能源资源计量采集数据表 对象功能接口")
@RestController
@RequestMapping("/energy")
public class TEpTotalEnergyController {
    private static final Logger log = LoggerFactory.getLogger(TEpTotalEnergyController.class);

    @Resource
    private TEpTotalEnergyService tEpTotalEnergyService;

    @Resource
    private SystemLogService systemLogService;

    /**
     * 能单位能源资源计量采集数据 分页查询
     * @Author YY
     * @param pageNum 页码
     * @param pageSize 单页数量
     * @param condition 查询条件（column=enterpriseCode&type=eq&value=915323277755123517）
     * @return 分页数据
     */
    @ApiOperation("查询分页数据")
    @GetMapping("/pageList")
    public Res<PageResult<TEpTotalEnergyDTO>> pageList(Long pageNum,Long pageSize,String condition) {
        Page<TEpTotalEnergyDTO> pageModel = tEpTotalEnergyService.selectByPage(pageNum, pageSize, condition);
        PageResult<TEpTotalEnergyDTO> dtoPageResult = new PageResult<>(pageModel);
        return Res.ok(dtoPageResult);
    }

    /**
     * 根据企业社会信用代码查询 （能耗对接录入模块调用）
     * @param pageNum
     * @param pageSize
     * @param conditionJson
     * @return
     */
    @ApiOperation("根据企业社会信用代码查询分页数据")
    @GetMapping("/getList")
    public Res<PageResult<TEpTotalEnergyDTO>> getList(@RequestParam(name = "pageNum", required = false, defaultValue = "1") long pageNum,
                                                      @RequestParam(name = "pageSize", required = false, defaultValue = "15") long pageSize,
                                                      @RequestParam(name = "condition", required = false) String conditionJson) {
        PageResult<TEpTotalEnergyDTO> dtoPageResult = tEpTotalEnergyService.pageList(pageNum,pageSize,conditionJson);
        return Res.ok(dtoPageResult);
    }

    /**
     * 数据上报接口
     * @Author YY
     * @param dataId 主键id
     * @return true or false
     */
    @ApiOperation("数据上报接口")
//    @PostMapping("/upload/{dataId}")
    public Res<Object> upLoadEnergyById(@PathVariable Long dataId, HttpServletRequest request){
        log.info("请求参数:{}", dataId);
        TEpTotalEnergyDTO dto = tEpTotalEnergyService.getById(dataId);
        Res<Object> res = tEpTotalEnergyService.upLoadEnergyOne(dto);

        // 记录日志
        saveUploadDataLog(dto, res, request);
        log.info("返回值：{}",res);
        return res;
    }

    /**
     * 能单位能源资源计量采集数据 按id查询
     * @Author YY
     * @param dataId 主键id
     * @return TEpTotalEnergyDTO
     */
    @ApiOperation("按id查询")
    @PostMapping("/{dataId}")
    public Res<TEpTotalEnergyDTO> energyById(@PathVariable Long dataId){
        log.info("请求参数:{}", dataId);
        TEpTotalEnergyDTO dto = tEpTotalEnergyService.getById(dataId);
        log.info("返回值：{}",dto.toString());
        return Res.ok(dto);
    }

    /**
     * excel导入
     * @Author juzipi123
     * @param file 导入的文件
     * @return 返回导入失败的信息
     */
    @ApiOperation("excel导入")
    @PostMapping("/importExcel")
    public Res<List<String>> importExcel(MultipartFile file) throws IOException {
        log.info("请求参数:{}", file.getName());
        List<String> list = tEpTotalEnergyService.importExcel(file);
        log.info("返回值：{}",list.toString());
        return Res.ok(list);
    }

    /**
     * excel导出 根据 统一社会信用代码 数据统计时间（月） 和 是否已上报（dataIndex 是否为空 0为空(没有上报) 1不为空(已上报)） 查询列表
     *
     * @Author juzipi123
     * @param response 导出文件
     * @param enterpriseCode 统一社会信用代码
     * @param statDate 数据统计时间 （2021-08）
     * @param dataIndex 端系统记录索引
     */
    @ApiOperation("excel导出")
    @GetMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response,String enterpriseCode,String statDate,String dataIndex) throws IOException {
        log.info("请求参数:{},{},{},{}", response.toString(),enterpriseCode,statDate,dataIndex);
        String dateString = statDate.substring(0, 7);
        System.out.println(dataIndex);
        List<TEpTotalEnergyExportVO> list = tEpTotalEnergyService.exportExcel(enterpriseCode,dateString,dataIndex);
        if(ObjectUtils.isEmpty(list)) {
            list.add(new TEpTotalEnergyExportVO());
        }
        if("0".equals(dataIndex)){
            EasyExcelUtils.writeWeb(dateString+"月_未上报数据", list, response);
        }else if("1".equals(dataIndex)) {
            EasyExcelUtils.writeWeb(dateString+"月_已上报数据", list, response);
        }else {
            EasyExcelUtils.writeWeb(dateString+"月_所有数据", list, response);
        }

    }

    /**
     * 单项目电力上报 （上报昨日用电）
     * @Author juzipi123
     * @param enterpriseCode 社会信用代码
     * @param energyTypeCode 能源类型代号
     */
    @GetMapping("automaticByEnterpriseCode")
    public void automaticByEnterpriseCode(String enterpriseCode,String energyTypeCode){
        log.info("请求参数:{},{}", enterpriseCode, energyTypeCode);
        tEpTotalEnergyService.automaticByEnterpriseCode(enterpriseCode,energyTypeCode);
    }

    /**
     * 上报企业昨日用电 （点位表 字段 escalation = 1 的项目（1：需要；0：不需要））
     * @Author juzipi123
     * @param energyTypeCode 能源类型代号
     */
    @GetMapping("automaticByDevicePoint")
    public void automaticByDevicePoint(String energyTypeCode){
        log.info("请求参数:{}", energyTypeCode);
        tEpTotalEnergyService.automaticByDevicePoint(energyTypeCode);
    }

    /**
     * 根据id更新
     * @Author YY
     * @param totalEnergyDTO totalEnergyDTO
     * @return Res<Boolean>
     */
    @ApiOperation("根据id更新")
    @PostMapping("update")
    public Res<Boolean> updateTotalEnergyById(@RequestBody TEpTotalEnergyDTO totalEnergyDTO){
        log.info("请求参数:{}", totalEnergyDTO.toString());
        boolean update = tEpTotalEnergyService.updateById(totalEnergyDTO);
        log.info("返回值：{}",update);
        return Res.ok(update);
    }


    /**
     * 保存数据上报日志
     * @Author YY
     * @param dto TEpTotalEnergyDTO
     * @param res Res<Object>
     * @param request HttpServletRequest
     */
    private void saveUploadDataLog(TEpTotalEnergyDTO dto, Res<Object> res, HttpServletRequest request){
        SystemLog systemLog = new SystemLog();
        systemLog.setRequestUrl(request.getRequestURL().toString());
        systemLog.setParams(dto.getDataId().toString());
        systemLog.setRequestTime(new Date());
        systemLog.setResponseCode(res.getStatus());
        systemLog.setRemark1("用能单位能耗数据-excel导入月度数据上报");
        systemLog.setEnterpriseCode(dto.getEnterpriseCode());
        systemLog.setRemark3(res.getMessage()+":"+res.getData());
        systemLog.setRemark4(dto.getDataId().toString());
        systemLog.setRemark5(dto.getDataCode());
        systemLogService.save(systemLog);
    }


    /**
     * 数据上报接口 v2
     * @Author YY
     * @param dataId 主键id
     * @return true or false
     */
    @ApiOperation("数据上报接口 v2")
    @PostMapping("/upload/{dataId}")
    public Res<Object> upLoadEnergyByIdV2(@PathVariable Long dataId, HttpServletRequest request){
        log.info("请求参数:{}", dataId);
        // 查询要上报的数据
        log.info("根据id查询上报数据：{}", dataId);
        TEpTotalEnergyDTO dto = tEpTotalEnergyService.getById(dataId);

        // 调用方法上报数据
        Res<Object> res = tEpTotalEnergyService.upLoadEnergyOneV2(dto);

        // 记录日志
        saveUploadDataLog(dto, res, request);
        log.info("返回值：{}",res);
        // 返回结果
        return res;

    }
    /**
     * 批量上报数据
     *
     * @param ids
     * @return 是否成功
     */
    @ApiOperation("通过主键进行批量上报数据")
    @PostMapping("/energyUploadBatch/{ids}")
    public Res<Object> upLoadEnergyBatchById(@PathVariable List<Long> ids){
        List<TEpTotalEnergyDTO> list = tEpTotalEnergyService.listByIds(ids);
        return tEpTotalEnergyService.upLoadEnergyBatch(list);
    }


    /**
     * 计算好需要上报的数据 （点位表 字段 escalation = 1 的项目（1：需要；0：不需要））
     *
     * @author : juzipi123
     * @return 结果
     */
    @ApiOperation("计算好需要上报的数据")
    @GetMapping("/countData")
    public Res<String> countData(){
        log.info("请求参数:无");
        String s = tEpTotalEnergyService.countData("3300");
        log.info("返回值：{}",s);
        return Res.ok(s);
    }

    /**
     * 通过主键进行逻辑删除数据
     *
     * @author : juzipi123
     * @param enterpriseId 主键
     * @return 是否成功
     */
    @ApiOperation("通过主键进行删除数据")
    @PostMapping("/logicDelete/{enterpriseId}")
    public Res<String> logicDeleteById(@PathVariable String enterpriseId) {
        log.info("请求参数：{}",enterpriseId);
        return tEpTotalEnergyService.removeById(enterpriseId) ? Res.ok("删除成功！") : Res.fail("删除失败！");
    }

    /**
     * 批量逻辑删除
     *
     * @param ids
     * @return 是否成功
     */
    @ApiOperation("通过主键进行批量删除数据")
    @PostMapping("/logicDeleteBatch/{ids}")
    public Res<String> logicDeleteBatchById(@PathVariable List<Long> ids){
        return tEpTotalEnergyService.removeBatchByIds(ids)? Res.ok("批量删除成功！") : Res.fail("批量删除失败！");
    }

    /**
     * 近一个月每日已上报数据
     * @return
     */
    @ApiOperation("获取近一个月每日已上报数据")
    @GetMapping("/getReportList")
    public Res<Map<String,Long>> getReportDateList(){
        return Res.ok(tEpTotalEnergyService.getReportList());
    }

    /**
     * 近一个月每日未上报数据
     * @return
     */
    @ApiOperation("获取近一个月每日未上报数据")
    @GetMapping("/getUnReportList")
    public Res<Map<String,Long>> getUnReportDateList(){
        return Res.ok(tEpTotalEnergyService.getUnReportList());
    }
}
